using System.Collections.Generic;
using System;
using System.Data.Odbc;
using Gestion_Api.AccesoDatos;
using System.Data.SqlClient;
using System.Data;

namespace Escuela
{
    public class CierreDiario
    {
        private int numero;
        private List<Pago> pagos;
        private DateTime fecha;
        private decimal montoTotal;
        private decimal diferencia;
        private string observacion;

        #region getters y setters
        
        public int Numero
        {
            get { return numero; }
            set { numero = value; }
        }
        public List<Pago> Pagos
        {
            get { return pagos; }
            set { pagos = value; }
        }

        public DateTime Fecha
        {
            get { return fecha; }
            set { fecha = value; }
        }

        public decimal MontoTotal
        {
            get { return montoTotal; }
            set { montoTotal = value; }
        }

        public decimal Diferencia
        {
            get { return diferencia; }
            set { diferencia = value; }
        }

        public string Observacion
        {
            get { return observacion; }
            set { observacion = value; }
        }
#endregion

        public CierreDiario()
        {
            this.pagos = new List<Pago>();
        }
        
        public void agregarPago(Pago pago)
        {
            this.pagos.Add(pago);
        }

        
        public int agregarDB(CierreDiario cd)
        {
            //Genero la clase de conexion
            AccesoDB ad = new AccesoDB();

            //genero query
            string query = "coop_cierre_diario_Insert ";
            query += "'" + cd.diferencia.ToString().Replace(',', '.') + "', ";
            query += "'" + cd.fecha.ToString("yyyyMMdd") + "', ";
            query += "'" + cd.montoTotal.ToString().Replace(',','.') + "', ";
            query += "'" + cd.observacion + "'";
          
            //Ejecuto el query
            //int resp = ad.ejecQuery(query);

            SqlCommand command = new SqlCommand();
            //command.Connection = connection;
            command.CommandText = query;
            command.CommandType = CommandType.Text;

            int resp = ad.ejecQueryResp(command);

            return resp;
        }
        private decimal buscarMontoAnteriorEnDB(int id)
        {

            //Genero la clase de conexion
            AccesoDB ad = new AccesoDB();

            string query = "coop_cierre_diario_GetOne '" + id + "'";
            //Ejecuto query y lo cargo en un data reader

            //SqlDataReader dr = ad.ExecuteReader(query);

            SqlCommand command = new SqlCommand();
            //command.Connection = connection;
            command.CommandText = query;
            command.CommandType = CommandType.Text;

            //Ejecuto query y lo cargo en un data reader
            SqlDataReader dr = ad.ExecuteReader(command);

            //recorro data reader
            if (dr.HasRows)
            {
                CierreDiario cd = new CierreDiario();
                while (dr.Read())
                {
                    cd.numero = dr.GetInt32(0);
                    cd.montoTotal = dr.GetDecimal(3);
                    cd.diferencia = dr.GetDecimal(1);
                    cd.fecha = dr.GetDateTime(2);
                }

                //Cierro el data reader
                dr.Close();
                return (cd.MontoTotal + cd.Diferencia);
            }
            else
            {
                //no encontre registros en la DB
                return 0;
            }

        }
        public CierreDiario crearCierreDiario(DateTime fechaActual)
        {
            CierreDiario cierreDiario = new CierreDiario();
            //TODO: EL MONTO TIENE QUE LLAMAR A UN METODO QUE BUSQUE EL MONTO QUE QUEDO DEL ULTIMO CIERRE GUARDADO
            decimal monto = 0;
            foreach (Pago pago in this.pagos)
            {
                cierreDiario.agregarPago(pago);
                monto += pago.Monto;
            }
            int idAnterior = cierreDiario.Numero - 1;
            decimal montoAnterior = this.buscarMontoAnteriorEnDB(idAnterior);
            decimal montoFinal = monto + montoAnterior;
            cierreDiario.montoTotal = montoFinal;
            cierreDiario.fecha = fechaActual;
            

            return cierreDiario;
        }
    }
}
